package com.vecspace.dayu.code.service;

import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import com.vecspace.data.model.NameItem;
import com.vecspace.dayu.code.dao.FuncDao;
import com.vecspace.dayu.code.pojo.Func;
import com.vecspace.exception.HException;
import com.vecspace.utils.Assert;
import com.vecspace.utils.NumberUtil;

/**功能描述 DAYU-功能定义的增、删、改查等业务操作的service类
 * @author wanghua
 * @reviewer
 * @template wanghua
 */
@Service("dayu_funcService")
public class FuncService {
	/** 根据ID查询 DAYU-功能定义 
	 * @param id   主键值
	 * @return Func
	 * @throws Exception
	 * @author wanghua
	 */
	public Func getFunc(Long id) throws Exception{
		return funcDao.getFunc(id);
	}
	
	/**逐级获取功能列表
	 * 
	 * @param projectId
	 * @param parentFuncId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<Func> getChildFuncs(Long projectId, Long parentFuncId) throws Exception{
		if(parentFuncId == null || parentFuncId <= 0) {
			return funcDao.getRootFuncs(projectId);
		}else {
			return funcDao.getChildFuncs(parentFuncId);
		}
	}
	
	/**获取所有可用的页面类型
	 * 
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 * @reviewer
	 */
	public List<NameItem> getValidPageLayouts(String terminalType) throws Exception {
		return funcDao.getValidPageLayouts(terminalType);
	}
	
	/**
	 * 获取项目内已有的java包名
	 * @param projectId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 * @reviewer
	 */
	public List<String> getJavaPkgs(Long projectId) throws Exception {
		return funcDao.getJavaPkgs(projectId);
	}

	/**获取系统的一级功能个数
	 * 
	 * @param projectId
	 * @return 
	 * @author wanghua
	 * @throws Exception 
	 * @reviewer
	 */
	public int getRootFuncsCount(Long projectId) throws Exception {
		return funcDao.getRootFuncsCount(projectId);
	}
	
	/**获取系统的所有功能
	 * 
	 * @param projectId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<Func> getAllFuncs(Long projectId) throws Exception {
		List<Func> funcs = funcDao.getAllFuncs(projectId);
		return funcs;
	}
	
	/**新建功能或者保存已有功能<br>
	 * 1、新建功能时，根据功能中选中的主表，创建数据集
	 * 2、保存已有功能时，不创建或者修改数据集
	 * @param func
	 * @param loginId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public Func saveOrCreateFunc(Func func, String loginId) throws Exception {
		if (func == null){
			return null;
		}
		
		func = saveViewFunc(func, loginId);

		return func;
	}
	/***将页面上传入的对象转为持久化对象（如果页面对象是一个新对象，则insert;否则从数据库库查询出已有的对象item2，将传入的值赋值给item2，然后将item2 update到数据库）
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return Func
	 * @throws Exception
	 * @author wanghua
	 */
	public Func saveViewFunc(Func item, String loginId) throws Exception {
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象的页面传值进行校验，如必填项，格式等 ***/
		//Assert.throwz(StringUtils.isNotBlank() , "条件不满足时抛出异常");
		/*** 结束校验 ***/
		
		Func item2;
		if (NumberUtil.isNotNullZero(item.getId())) {
			/**从数据库中取出原始对象，将从页面传过来的新值赋值给原始对象，并将原始对象再保存到数据库中 **/
			item2 = getFunc(item.getId());
			if (item2 != null) {
				/*** 将页面上的新值逐一赋值，不在页面上的属性不要进行赋值 ***/
				///item2.setProjectId(item.getProjectId());//更新项目ID
				item2.setName(item.getName());//更新功能名称
				item2.setParentId(item.getParentId());//更新上级功能ID
				item2.setJavaPkg(item.getJavaPkg());//更新Java包名称
				item2.setFileName(item.getFileName());
				item2.setWebPageLayoutId(item.getWebPageLayoutId());//更新主页面布局
				item2.setAppPageLayoutId(item.getAppPageLayoutId());//更新APP页面布局
				item2.setPadPageLayoutId(item.getPadPageLayoutId());//更新PAD页面布局
				item2.setTablesRelation(item.getTablesRelation());//更新涉及数据表关系
				item2.setPageLang(item.getPageLang());//更新页面语言
				item2.setConfigStatus(item.getConfigStatus());
				item2.setWfCode(item.getWfCode());//工作流流程编号
				item2.setTips(item.getTips());//更新功能说明
				item2.setRemarks(item.getRemarks());//更新功能说明
				item2.setOrdnum(item.getOrdnum());//更新顺序号

				/**end**/
			} else {
				item2 = item;
			}
		}else{ //item是新增加的对象
			item2 = item;
		}
		saveFunc(item2, loginId);
		return item2;
	}
	
	/** 插入或修改 DAYU-功能定义 ，item中的所有属性都会更新到数据库中（包括属性值为null的，也会将null更新到数据库，覆盖之前的值）。
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void saveFunc(Func item, String loginId) throws Exception{
		if (item == null){
			return;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		Assert.throwz(NumberUtil.isNotNullZero(item.getProjectId()), "projectId不能为空");
		/*** 结束校验 ***/
		Date date = new Date();
		if (NumberUtil.isNullOrZero(item.getId())) {

			item.setId(null);
			item.setDelTag(0);
			item.setCreateTime(date);
			item.setCreateUser(loginId);//更新记录创建人ID

		} else {

		}
		if(item.getParentId() == null || item.getParentId() == 0) {
			item.setParentId(-1L);
		}
		funcDao.saveFunc(item);
	}
	
	/** 根据ID删除 DAYU-功能定义 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void deleteFunc(Long id) throws Exception{
		int count = funcDao.getChildFuncCount(id);
		if(count > 0) {
			throw new HException("还存在子节点，不能删除！");
		}
		funcDao.deleteFunc(id);
	}
	
	/** property **/
	@Autowired
	private FuncDao funcDao;

}
